import { mergeRecursive } from "@/utils/objectUtils";
import DictOptions from './DictOptions'

/**
 * @classdesc 字典元数据类，用于描述字典的元信息
 * @property {String} type - 字典类型
 * @property {Function} request - 请求字典数据的方法
 * @property {String} labelField - 字典中用作标签的字段
 * @property {String} valueField - 字典中用作值的字段
 * @property {Boolean} lazy - 是否延迟加载，默认为 true
 */
export default class DictMeta {
  constructor(options) {
    this.type = options.type
    this.request = options.request
    this.responseConverter = options.responseConverter
    this.labelField = options.labelField
    this.valueField = options.valueField
    this.lazy = options.lazy === true
  }
}

/**
 * 解析字典元数据
 * @param {String|Object} options - 字典元数据的配置信息，可以是字符串或对象
 * @returns {DictMeta} - 返回解析后的字典元数据对象
 */
DictMeta.parse = function (options) {
  let opts = null
  if (typeof options === 'string') {
    // 如果 options 是字符串，则从 DictOptions 中获取对应的配置，或使用空对象
    opts = DictOptions.metas[options] || {}
    opts.type = options
  } else if (typeof options === 'object') {
    // 如果 options 是对象，则直接使用该对象
    opts = options
  }
  // 将配置与默认配置合并
  opts = mergeRecursive(DictOptions.metas['*'], opts)
  // 创建并返回字典元数据对象
  return new DictMeta(opts)
}
